package com.example.demo.utils.ResolveUtils;


import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfTextExtractor;
import lombok.extern.slf4j.Slf4j;
import org.apache.pdfbox.pdfparser.PDFParser;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.util.PDFTextStripper;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

@Slf4j
public class PdfUtil {

    /**
     * @Description: 提取pdf中的文字 第一种方法
     * @Param: fileUrlList：地址
     * @Param: pages：页码
     * @return: content：提取的文字
     */
    public static String PDFToWord(String fileUrlList) throws IOException {
        //linux---start---
        fileUrlList = fileUrlList.replaceAll("\\\\", File.separator);
        //linux--end----
        Integer pages = PDFToPage(fileUrlList);
        String fileName = fileUrlList;//源文件的位置
        PdfReader reader = null;//PDF读取器
        reader = new PdfReader(fileName);
        String content = "";
        for (int i = 1; i <= pages; i++) {
            content += PdfTextExtractor.getTextFromPage(reader, i); // 读取PDF中第i页（用哪一页就写几）的文档内容，并转成String
        }
        content = content.replace("\n", "");
        content = content.replace("\\\\r", "");
        content = content.replace("\\\\t", "");
        log.debug(content);//控制台打印PDF第一页的内容
        return content;
    }

    /**
     * @Description: 提取pdf中的页码
     * @Param: fileUrlList：地址
     * @return: pages：页码数
     */
    public static int PDFToPage(String fileUrlList) {
        //linux---start---
        fileUrlList = fileUrlList.replaceAll("\\\\", File.separator);
        //linux--end----
        File file = new File(fileUrlList);
        PdfReader pdfReader = null;
        try {
            pdfReader = new PdfReader(new FileInputStream(file));
        } catch (IOException e) {
            e.printStackTrace();
        }
        int pages = pdfReader.getNumberOfPages();
        log.debug("pdf文件的总页数为:" + pages);
        return pages;
    }

    /**
     * @Description: 提取pdf中的文字 第二种方法
     * @Param: pdfPath：地址
     * @return: content：提取的文字
     */
    public static String getTextFromPdf(String pdfPath) {
        String content = null;
        try {
            // 是否排序
            boolean sort = false;
            // 开始提取页数
            int startPage = 1;
            // 结束提取页数
            int endPage = Integer.MAX_VALUE;
            //InputStream input = null;
            //linux---start---
            // pdfPath = pdfPath.replaceAll("\\\\", File.separator);
            //linux--end----
            File pdfFile = new File(pdfPath);
            PDDocument document = null;

            try (InputStream input = new FileInputStream(pdfFile)) {
                // 加载 pdf 文档
                PDFParser parser = new PDFParser(input);
                parser.parse();
                document = parser.getPDDocument();
                // 获取内容信息
                PDFTextStripper pts = new PDFTextStripper();
                pts.setSortByPosition(sort);
                endPage = document.getNumberOfPages();
                log.debug("Total Page: " + endPage);
                pts.setStartPage(startPage);
                pts.setEndPage(endPage);
                try {
                    content = pts.getText(document);
                } catch (Exception e) {
                    throw e;
                }
                log.debug("Get PDF Content ...");
            } catch (Exception e) {
                throw e;
            } finally {
                if (null != document)
                    document.close();
            }
            content = content.replace("\n", "");
            content = content.replace("\\\\r", "");
            content = content.replace("\\\\t", "");
        } catch (Exception e) {
            log.error("getTextFromPdf [{}] is error", pdfPath);
        }
        return content;

    }

    /**
     * @Description: 提取pdf中的页码
     * @Param: fileUrlList：地址
     * @return: pages：页码数
     */
    public static int PDFToPage2(String fileUrlList) {
        //linux---start---
        fileUrlList = fileUrlList.replaceAll("\\\\", File.separator);
        //linux--end----
        File file = new File(fileUrlList);
        PdfReader pdfReader = null;
        try {
            pdfReader = new PdfReader(new FileInputStream(file));
        } catch (IOException e) {
            e.printStackTrace();
        }
        int pages = pdfReader.getNumberOfPages();
        log.debug("pdf文件的总页数为:" + pages);
        return pages;
    }

    /**
     * @Description: 提取pdf中的文字 第二种方法
     * @Param: pdfPath：地址
     * @return: content：提取的文字
     */
    public static String getTextFromPdf3(String pdfPath) {
        String content = null;
        try {
            // 是否排序
            boolean sort = false;
            // 开始提取页数
            int startPage = 1;
            // 结束提取页数
            int endPage = Integer.MAX_VALUE;
            //InputStream input = null;
            //linux---start---
            // pdfPath = pdfPath.replaceAll("\\\\", File.separator);
            //linux--end----
            File pdfFile = new File(pdfPath);
            PDDocument document = null;

            try (InputStream input = new FileInputStream(pdfFile)) {
                // 加载 pdf 文档
                PDFParser parser = new PDFParser(input);
                parser.parse();
                document = parser.getPDDocument();
                // 获取内容信息
                PDFTextStripper pts = new PDFTextStripper();
                pts.setSortByPosition(sort);
                endPage = document.getNumberOfPages();
                log.debug("Total Page: " + endPage);
                pts.setStartPage(startPage);
                pts.setEndPage(endPage);
                try {
                    content = pts.getText(document);
                } catch (Exception e) {
                    throw e;
                }
                log.debug("Get PDF Content ...");
            } catch (Exception e) {
                throw e;
            } finally {
                if (null != document)
                    document.close();
            }
            content = content.replace("\n", "");
            content = content.replace("\\\\r", "");
            content = content.replace("\\\\t", "");
        } catch (Exception e) {
            log.error("getTextFromPdf [{}] is error", pdfPath);
        }
        return content;

    }
}

